from qturboframe.public_ui.base_element import BaseElement
from qturboframe.lib.utils.check import CheckBasic
from qturboframe.lib.utils.CustomError.custom_error import CustomError
from qturboframe.lib.report.log import logger
from qturboframe.lib.webdriver.exceptions import SeleniumError


class InputType(BaseElement, CheckBasic):
    '''hui文本框操作类'''

    def __init__(self, element_para, father=None, timeout=5):
        super().__init__(element_para, father, timeout)
        class_list = self._element.get_attribute('class').split(' ')
        if 'h-input-wrapper' not in class_list:
            self._element = self._element.find_element_by_attribute(
                'xpath', './ancestor::div[contains(@class, "h-input-wrapper")]', timeout=self.timeout)
        self.input_type = self._element.find_element_by_attribute(
            'css selector','.h-input', timeout=self.timeout)

    def set_value(self, value):
        '''
        hui文本框填充

        :Args:
         - text: 填充值

        :Example:
         - 例: input_type.set_value('admin')
        '''
        self.input_type.focus()
        self.input_type.clear()
        self.input_type.send_keys(value)

    def is_default(self, value):
        """
        检查hui文本框件默认值

        :Args:
         - value: 待检查的值

        :Returns:
            检查匹配返回True，否则返回False

        :Example:
         - 例: input_type.is_default('admin')
        """
        self.input_type.focus()
        if self.input_type.text:
            text = self.input_type.text
        elif self.input_type.get_attribute('value'):
            text = self.input_type.get_attribute('value')
        elif self.input_type.get_attribute('placeholder'):
            text = self.input_type.get_attribute('placeholder')
        elif self.input_type.get_attribute('title'):
            text = self.input_type.get_attribute('title')
        else:
            text = ''
        if text == value:
            return True
        else:
            rmessage = '文本框默认值校验不通过！'
            raise SeleniumError(CustomError.Error_EQ03013000_Input_Check, message)

    def is_readonly(self):
        '''
        检查hui文本框是否只读

        :Return:
            只读返回True，否则返回False

        :Example:
         - 例: input_type.is_readonly()
        '''
        self.input_type.focus()
        return self.input_type.is_readonly()

    def is_nonnull(self):
        '''
        检查hui文本框是否有非空属性

        :Returns:
            非空返回True，否则返回False

        :Example:
         - 例: input_type.is_nonnull()
        '''
        self.input_type.focus()
        form_item = self._element.find_element_by_attribute(
            'xpath', './ancestor::div[contains(@class, "h-form-item-content")]/'
                     'parent::div[contains(@class, "h-form-item")]', timeout=self.timeout)
        item_class_list = form_item.get_attribute('class').split()
        if 'h-form-item-required' in item_class_list:
            return True
        else:
            return False

    def clear(self):
        '''
        hui文本框清空

        :Usage:
         - input_type.clear()
        '''
        self.input_type.focus()
        self.input_type.clear()

    def check_default(self, value):
        '''
        校验hui文本框默认值

        :Args:
         - value: 待检查的值

        :Raises:
            SeleniumError: 文本框默认值校验不通过

        :Example:
         - 例: input_type.check_default('admin')
        '''
        if not self.is_default(value):
            message = '文本框默认值校验不通过！'
            raise SeleniumError(CustomError.Error_EQ03013000_Input_Check, message)

    def check_readonly(self):
        '''
        校验hui文本框只读属性

        :Raises:
            SeleniumError: 文本框只读校验不通过

        :Example:
         - 例: input_type.check_readonly()
        '''
        if not self.is_readonly():
            message = '文本框只读校验不通过！'
            raise SeleniumError(CustomError.Error_EQ03013000_Input_Check, message)

    def check_nonnull(self):
        '''
        校验hui文本框非空属性

        :Raises:
            SeleniumError: 文本框非空校验不通过

        :Example:
         - 例: input_type.check_nonnull()
        '''
        if not self.is_nonnull():
            message = '文本框非空校验不通过！'
            raise SeleniumError(CustomError.Error_EQ03013000_Input_Check, message)

